// by twoer 2011-07-15
// jquery.tableDynamicRow-1.0.js v1.0 表格动态行


(function($)
{
	$.extend($,{
		
		tableDynamicRow:function(options)
		{
			$.tableDynamicRow.defaults = 
			{
				table:'',//table 选择器
				template: '',//模板 Html
				marker:'#index#',//要替换的标记
				index:0,//默认 index
				minRows:1,//最小行数
				minRowsMessage:'min rows message .',//少于最小行数提示信息
				maxRows:10,//最大行数
				maxRowsMessage:'max rows message .',//超过最大行数提示信息
				initRowCount:1,//初始化行数
				onBeforeInsert:$.noop,//增加前事件
				onInsert:$.noop,//增加事件
				onBeforeRemove:$.noop,//移除前事件
				onRemove:$.noop //移除事件
			};
		
			var opts = $.extend({},$.tableDynamicRow.defaults, options);
			var currentIndex =opts.index;
			var count =0;
			
			var tables =  $(opts.table);
			if(tables.lenght < 1)
			{
				alert('table not find .');
				return;
			}
			
			
			tables.replace=function(template,marker,replacer)
			{
				
				if(!template )
				{
					alert('template not find .');
					return null;
				}
				
				var regex = new RegExp(marker, "ig");
				return template.replace(regex,replacer);
			}
			
			tables.insert=function(te,index)
			{
				//on before insert
				opts.onBeforeInsert & opts.onBeforeInsert(currentIndex);
				
				if(opts.maxRows != 0 && count >= opts.maxRows )
				{
					alert(opts.maxRowsMessage);
					return;
				}
				var tr = null;
				
				if (te) {
					tr = $(tables.replace(te,opts.marker,currentIndex));
				}else{
					tr = $(tables.replace(opts.template,opts.marker,currentIndex));
				}
				
				if(index == undefined || index.length <1)
					tables.append(tr);
				else
				{
					var temp = tables.find('> tr:eq(' + index + ')');
					if(temp.length < 1)
						tables.append(tr);
					else
						tables.find('> tr:eq(' + index + ')').before(tr);
				}
				
				//on insert
				opts.onInsert & opts.onInsert(tr,currentIndex);
				
				//currentIndex++;
				count++;
				return currentIndex++;
			}
			
			tables.remove=function(index)
			{
				//on before remove
				opts.onBeforeRemove & opts.onBeforeRemove();
				
				if(opts.minRows != 0 && count <= opts.minRows )
				{
					alert(opts.minRowsMessage);
					return;
				}
				
				var tr =null;
				if(index == undefined || index.length <1)
					tr = tables.find('> tr').last();
				else
					tr = tables.find('tr:eq(' + index + ')');
				//alert("index-->"+index+"-->"+tr);	
				if(tr.length <1 )
					return;
				
				tr.remove();
				count--;
				
				//on remove
				opts.onRemove & opts.onRemove(tables);
			}
			
			tables.getVirtualCount=function()
			{
				return currentIndex;
			}
			
			for(var i=0; i< opts.initRowCount;i++)
			{
				tables.insert();
			}
			return tables;
		}
	});
})(jQuery);